package com.swak.fx.support;

import javafx.application.Platform;
import javafx.collections.ObservableList;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import lombok.Getter;

/**
 * Display.
 * 
 * @author 618lf
 */
public enum Display {

	INSTANCE;

	@Getter
	private static Stage stage;

	public static void setStage(final Stage stage) {
		Display.stage = stage;
	}

	/**
	 * 系统 logo
	 * 
	 * @return
	 */
	public static Image logo() {
		if (!Display.stage.getIcons().isEmpty()) {
			return Display.stage.getIcons().get(0);
		}
		return null;
	}

	/**
	 * 系统 logo
	 * 
	 * @return
	 */
	public static ObservableList<Image> logoObservable() {
		return Display.stage.getIcons();
	}

	/**
	 * 加载资源
	 * 
	 * @param path
	 * @return
	 */
	public static java.net.URL load(String path) {
		return Display.class.getResource(path);
	}

	/**
	 * 加载资源
	 * 
	 * @param clazz
	 * @param path
	 * @return
	 */
	public static java.net.URL load(Class<?> clazz, String path) {
		return clazz.getResource(path);
	}
	
	/**
	 * 加载图片
	 * 
	 * @param clazz
	 * @param path
	 * @return
	 */
	public static Image loadImage(java.net.URL url) {
		return new Image(url.toExternalForm());
	}

	/**
	 * 加载图片
	 * 
	 * @param clazz
	 * @param path
	 * @return
	 */
	public static Image loadImage(Class<?> clazz, String path) {
		return new Image(Display.load(clazz, path).toExternalForm());
	}

	/**
	 * 如果当前线程属于 UI 线程，则执行 runnable，否则调用 Platform.runLater() 来执行 runnable。 这样能保证
	 * runnable 是在 UI 线程上执行。
	 * 
	 * @param runnable
	 */
	public static void runUI(Runnable runnable) {
		if (Platform.isFxApplicationThread()) {
			runnable.run();
		} else {
			Platform.runLater(runnable);
		}
	}

	/**
	 * 如果当前线程属于 UI 线程，则执行 runnable，否则调用 Platform.runLater() 来执行 runnable。 这样能保证
	 * runnable 是在 UI 线程上执行。
	 * 
	 * @param runnable
	 */
	public static void runOnUI(Runnable runnable) {
		Platform.runLater(runnable);
	}
}